﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using OBL1_DiseñoDeAplicaciones.ObjetosDeNegocio;
using OBL1_DiseñoDeAplicaciones.Utilidades;

namespace OBL1_DiseñoDeAplicaciones.Interfaz
{
    public partial class Proyecto_Alta : Form,IObservado
    {
        private Empresa empresa;
        private List<IObservador> observadores= new List<IObservador>();
        
        public Proyecto_Alta(IObservador pObs)
        {
            InitializeComponent();
            
            empresa = Empresa.GetInstance();
            this.pnlTareaInicial.Visible = true;
            this.agregarObservador(pObs);
            CargarComboCliente();
        }

        #region OBSERVADO

        public void agregarObservador(IObservador obs)
        {
            // Agrega un objeto Observador a la colección
            observadores.Add(obs);
        }

        public void removerObservador(IObservador obs)
        {
            observadores.Remove(obs);
        }

        public void notificarTodos()
        {
            foreach (IObservador i in observadores)
            {
                i.actualizar();
            }

        }

        #endregion

        private void CargarComboCliente() {
            cbClientes.DataSource = empresa.Clientes;
            cbClientes.DisplayMember = "Nombre";
            cbClientes.ValueMember = "Ruc";
        
        }

        private bool validarCamposRequeridos() {
            bool retorno = true;
            if (txtNombre.Text.Equals(""))
            {
                lblNombreRequerido.Visible = true;
                retorno = false;
            }
            
            if (txtDescripcionTarea.Text.Equals(""))
            {
                lblDescripcionRequerida.Visible = true;
                retorno = false;
            }
            if (dtpFechaInicio.Text.Equals(""))
            {
                lblFechaInicioRequerida.Visible = true;
                retorno = false;
            }
            if (txtCostoTarea.Text.Equals(""))
            {
                lblCostoRequerido.Visible = true;
                retorno = false;
            }
            
            if (retorno)
            {
                lblErrores.Text = "";
            }
            else {
                lblErrores.Text = "Los campos con (*) son requeridos.";
            }
            return retorno;
        }

        private void BtnGuardar_Click(object sender, EventArgs e)
        {

            if (validarCamposRequeridos())
            {
                try
                {
                    try
                    {
                        Tarea tarea = new Tarea(txtDescripcionTarea.Text, DateTime.Parse(dtpFechaInicio.Text), double.Parse(txtCostoTarea.Text));                        
                        Cliente cliente = (from Cliente c in empresa.Clientes where c.Ruc == cbClientes.SelectedValue.ToString() select c).First();
                        empresa.AgregarProyecto(txtNombre.Text, cliente, tarea);
                        
                        this.notificarTodos();
                        this.Dispose();
                    }
                    //corregida las chanchadas de catch - mati
                    catch (FormatException)
                    {
                        lblErrores.Text = "El costo de la tarea debe ser numérico.";
                    }
                    catch (OverflowException)
                    {
                        lblErrores.Text = "El costo es un valor fuera de rango.";
                    }
                }
                //este catch no lo entiendo - mati
                catch (InvalidCastException)
                {
                    lblErrores.Text = "El codigo del proyecto debe ser numérico.";
                }
            }

        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Dispose();
        }
    }
}
